package sunyu.toolkit.core;

/**
 * 字节工具类
 *
 * @author 孙宇
 */
public class ByteKit {

    /**
     * 16进制字符串转byte数组
     *
     * @param hexString 16进制字符串
     * @return 字节数组
     */
    public static byte[] hexString2bytes(String hexString) {
        byte[] res = new byte[hexString.length() / 2];
        char[] chs = hexString.toCharArray();
        for (int i = 0, c = 0; i < chs.length; i += 2, c++) {
            res[c] = (byte) (Integer.parseInt(new String(chs, i, 2), 16));
        }
        return res;
    }

    /**
     * 大端模式
     * int转byte数组
     *
     * @param num    数字
     * @param length byte数组长度
     * @return 字节数组
     */
    public static byte[] int2bytes(int num, int length) {
        byte[] bytes = new byte[length];
        for (int i = 0; (i < 4) && (i < length); i++) {
            bytes[i] = (byte) (num >> 8 * i & 0xFF);
        }
        if (length == 1) {
            return new byte[]{bytes[0]};
        } else if (length == 2) {
            return new byte[]{bytes[1], bytes[0]};
        } else if (length == 4) {
            return new byte[]{bytes[3], bytes[2], bytes[1], bytes[0]};
        }
        return bytes;
    }

    /**
     * 大端模式
     * byte数组中取int数值，本方法适用于(低位在后，高位在前)的顺序
     *
     * @param bytes  字节数组
     * @param length byte[]长度
     * @return int
     */
    public static int bytes2int(byte[] bytes, int length) {
        int value;
        if (length == 4) {
            value = (int) (((bytes[0] & 0xFF) << 24)
                    | ((bytes[1] & 0xFF) << 16)
                    | ((bytes[2] & 0xFF) << 8)
                    | (bytes[3] & 0xFF));
        } else if (length == 2) {
            value = (int) (((bytes[0] & 0xFF) << 8)
                    | (bytes[1] & 0xFF));
        } else {
            value = (int) ((bytes[0] & 0xFF));
        }
        return value;
    }

    /**
     * byte数组合并
     *
     * @param bytes1 字节数组1
     * @param bytes2 字节数组2
     * @return 新字节数组
     */
    public static byte[] byteMerger(byte[] bytes1, byte[] bytes2) {
        byte[] bytes3 = new byte[bytes1.length + bytes2.length];
        System.arraycopy(bytes1, 0, bytes3, 0, bytes1.length);
        System.arraycopy(bytes2, 0, bytes3, bytes1.length, bytes2.length);
        return bytes3;
    }

    /**
     * 获得byte数组
     *
     * @param bytes      原byte数组
     * @param startIndex 起始位置
     * @param length     获得长度
     * @return 新字节数组
     */
    public static byte[] getRange(byte[] bytes, int startIndex, int length) {
        byte[] b = new byte[length];
        System.arraycopy(bytes, startIndex, b, 0, length);
        return b;
    }

    /**
     * 获得byte数组
     *
     * @param bytes      原byte数组
     * @param startIndex 起始位置
     * @return 新字节数组
     */
    public static byte[] getRange(byte[] bytes, int startIndex) {
        return getRange(bytes, startIndex, bytes.length - startIndex);
    }


    /**
     * 字符串转byte数组
     *
     * @param str 字符串
     * @return 转换后的byte数组
     */
    public static byte[] string2bytes(String str) {
        return str.getBytes();
    }


}
